#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
#include <inttypes.h>

#include "../src/myexp_impl.h"
#include "../src/myexp.inl"

// 这里我们定义定点数的表示法
// 定点数采用64位整数来表示，采用补码格式，包括1位符号位，2位整数位,61位小数位
// 最高位是符号位，次高位的权重是2,次次高位的权重是１，最低位的权重是2^-61
// 当最高位为0,可表示[0-4)区间的浮点数，当最高位为1,表示(-4,0)区间的浮点数

void test_fixpoint_mul()
{
   printf("\nrun %s()\n",__func__);

   int64_t i1= ((int64_t)(1) << 61);  // 1
   int64_t i2= ((int64_t)(-1) << 61);  // -1
   
   double f1,f2;
   int t;
   //f1=0.0070;
   //f2=-0.0070;
   t=scanf("%lf",&f1);  // here f1 must < 2^-7
   t=scanf("%lf",&f2);  // here f2 must < 2^-7

   int64_t j1= double_2_fixpoint(f1);
   int64_t j2= double_2_fixpoint(f2);

   int64_t r1 = fixpoint_mul(i1,j1);
   int64_t r2 = fixpoint_mul(i1,j2); 
   int64_t r3 = fixpoint_mul(i2,j1);  
   int64_t r4 = fixpoint_mul(i2,j2);

   printf("1*%.18lf=%.18lf\n",f1, fixpoint_2_double(r1));
   printf("1*%.18lf=%.18lf\n",f2, fixpoint_2_double(r2));
   printf("-1*%.18lf=%.18lf\n",f1, fixpoint_2_double(r3));
   printf("-1*%.18lf=%.18lf\n",f2, fixpoint_2_double(r4));
}

int main(int argc, char* argv[])
{
   test_fixpoint_mul();
   return 0;
}

